package  
{
	import net.flashpunk.Entity;
	import net.flashpunk.FP;
	

	public class Camara
	{
		private var cameraOffset:int;
		private var cameraSpeed:int;
		
		public function Camara(_cameraOffset:int, _cameraSpeed:int) 
		{
			cameraOffset = _cameraOffset;
			cameraSpeed = _cameraSpeed;
		}
		
		public function adjustToPlayer(mapWidth:int, mapHeight:int, player:Entity):void
		{
			// Find the coordinates to that would center the player 
			var newCameraX:int = (player.x + player.width/2) - FP.width / 2;
			var newCameraY:int = (player.y + player.height/2) - FP.height / 2;
			
			// Check if they go beyond map boundaries
			if (newCameraX < 0) newCameraX = 0;
			else if (newCameraX + FP.width > mapWidth) newCameraX = mapWidth - FP.width;
			
			if (newCameraY < 0) newCameraY = 0;
			else if (newCameraY + FP.height > mapHeight) newCameraY = mapHeight - FP.height;
			
			// Set the camera coordinates
			
			FP.camera.x = newCameraX;
			FP.camera.y = newCameraY;
		}
		
		public function followPoint(mapWidth:int, mapHeight:int, x:Number,y:Number ):void
		{
			
			var newpointX:Number = x-16 - FP.screen.width/2;
			var newpointY:Number = y - 16 - FP.screen.height/2;
			
			var oldpointX:Number = FP.camera.x;
			var oldpointY:Number = FP.camera.y;
			
			// calculamos el desplazamiento como un proporcional a la diferencia
	        // entre el viejo centro y el nuevo (y factor y el paso de tiempo)
	        var scrollDeltax:Number;
			var scrollDeltay:Number;
			var factor:Number = cameraSpeed;
	        scrollDeltax=(newpointX-oldpointX)*(factor*FP.elapsed);
	        scrollDeltay=(newpointY-oldpointY)*(factor*FP.elapsed);		
			
			// aplicamos el desplazamiento
	        newpointX=oldpointX+scrollDeltax;
	        newpointY=oldpointY+scrollDeltay;	
			
			
			//---*Seteamos el nuevo punto a la camara:
			FP.camera.x = newpointX;
			FP.camera.y = newpointY;
			
			//---*Chequea el Eje X:
			//---*Si la camara topa con el limite Izquierdo del Level:
			if (FP.camera.x  < 0.0) {				
				FP.camera.x = 0;
			}
			//---*Si la camara topa con el limite derecho del Level:
			if ( (FP.camera.x + FP.screen.width) > mapWidth) {				
				FP.camera.x = mapWidth - FP.screen.width;
			}
			
			//---*Chequea el Eje Y:
			//---*Si la camara en Y topa con el limite superior del Level:
			if (FP.camera.y < 0.0) {
				FP.camera.y = 0.0;
			}
			if ((FP.camera.y + FP.screen.height) > mapHeight) {
				 FP.camera.y = mapHeight - FP.screen.height;
			}	
		
		}
		
		public function MoveTo(mapWidth:int, mapHeight:int, x:Number,y:Number ):void
		{
			
			var newpointX:Number = x-16 - FP.screen.width/2;
			var newpointY:Number = y - 16 - FP.screen.height/2;
			
			var oldpointX:Number = FP.camera.x;
			var oldpointY:Number = FP.camera.y;
			
			// calculamos el desplazamiento como un proporcional a la diferencia
	        // entre el viejo centro y el nuevo (y factor y el paso de tiempo)
	        var scrollDeltax:Number;
			var scrollDeltay:Number;
			var factor:Number = cameraSpeed;
	        scrollDeltax=(newpointX-oldpointX)
	        scrollDeltay=(newpointY-oldpointY)
			
			// aplicamos el desplazamiento
	        newpointX=oldpointX+scrollDeltax;
	        newpointY=oldpointY+scrollDeltay;				
			
			//---*Seteamos el nuevo punto a la camara:
			FP.camera.x = newpointX;
			FP.camera.y = newpointY;
			
			//---*Chequea el Eje X:
			//---*Si la camara topa con el limite Izquierdo del Level:
			if (FP.camera.x  < 0.0) {				
				FP.camera.x = 0;
			}
			//---*Si la camara topa con el limite derecho del Level:
			if ( (FP.camera.x + FP.screen.width) > mapWidth) {				
				FP.camera.x = mapWidth - FP.screen.width;
			}
			
			//---*Chequea el Eje Y:
			//---*Si la camara en Y topa con el limite superior del Level:
			if (FP.camera.y < 0.0) {
				FP.camera.y = 0.0;
			}
			if ((FP.camera.y + FP.screen.height) > mapHeight) {
				 FP.camera.y = mapHeight - FP.screen.height;
			}	
		
		}
	}
}